
var inherits    = require('inherits')
var Promise     = require('../../promise')
var Transaction = require('../../transaction')
var assign      = require('lodash/object/assign');
var debugTx     = require('debug')('knex:tx')

function Oracle_Transaction(client, container, config, outerTx) {
  Transaction.call(this, client, container, config, outerTx)
}
inherits(Oracle_Transaction, Transaction)

assign(Oracle_Transaction.prototype, {

  // disable autocommit to allow correct behavior (default is true)
  begin: function() {
    return Promise.resolve()
  },

  commit: function(conn, value) {
    this._completed = true
    return conn.commitAsync()
      .return(value)
      .then(this._resolver, this._rejecter)
  },

  release: function(conn, value) {
    return this._resolver(value)
  },  

  rollback: function(conn, err) {
    this._completed = true
    debugTx('%s: rolling back', this.txid)
    return conn.rollbackAsync()
      .throw(err)
      .catch(this._rejecter)
  },

  acquireConnection: function(config) {
    var t = this
    return Promise.try(function() {
      return config.connection || t.client.acquireConnection()  
    }).tap(function(connection) {
      if (!t.outerTx) {
        connection.setAutoCommit(false)
      }
    }).disposer(function(connection) {
      debugTx('%s: releasing connection', t.txid)
      connection.setAutoCommit(true)
      if (!config.connection) {
        t.client.releaseConnection(connection)
      } else {
        debugTx('%s: not releasing external connection', t.txid)
      }
    })
  }

})

module.exports = Oracle_Transaction
